package org.example.config.redis;

import org.example.entity.constants.Constants;
import org.example.entity.dto.SysSettingDto;
import org.example.entity.dto.TokenUserInfoDto;
import org.example.entity.enums.ResponseCodeEnum;
import org.example.exception.BusinessException;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Description
 * @Author susu
 * @Date 2024/9/5
 */
@Component
public class RedisComponent {

    @Resource
    private RedisUtils redisUtils;
    @Resource
    private RedisTemplate<String,Object> redisTemplate;

    //获取心跳
    public Long getUserHeartBeat(String userId){
        return (Long) redisUtils.get(Constants.REDIS_KEY_WS_USER_HEART_BEAT + userId);
    }

    public void saveTokenUserInfoDto(TokenUserInfoDto tokenUserInfoDto){
        redisUtils.setex(Constants.REDIS_KEY_WS_TOKEN + tokenUserInfoDto.getToken(),tokenUserInfoDto,Constants.REDIS_KEY_EXPIRES_DAY);
        redisUtils.setex(Constants.REDIS_KEY_WS_TOKEN_USERID + tokenUserInfoDto.getUserId(),tokenUserInfoDto.getToken(),Constants.REDIS_KEY_EXPIRES_DAY);
    }

    public TokenUserInfoDto getTokenUserInfoDto(String token){
        Object o = redisUtils.get(Constants.REDIS_KEY_WS_TOKEN +token);
        return (TokenUserInfoDto)o;
    }
    public SysSettingDto getSysSetting(){
        SysSettingDto o = (SysSettingDto)redisUtils.get(Constants.REDIS_KEY_SYS_SETTING);
        o = o == null ? new SysSettingDto() : o;
        return o;
    }

    public void saveSysSetting(SysSettingDto dto){
        boolean set = redisUtils.set(Constants.REDIS_KEY_SYS_SETTING, dto);
        if (!set){
            throw new BusinessException(ResponseCodeEnum.CODE_600);
        }
    }

    public void saveHeartBeat(String userId){
        redisUtils.setex(Constants.REDIS_KEY_WS_USER_HEART_BEAT + userId,System.currentTimeMillis(),Constants.REDIS_KEY_EXPIRES_HEART_BEAT);
    }


    public void saveMyContact(String userId, List<String> userContactList) {
        redisUtils.delete(Constants.REDIS_KEY_USER_CONTACT + userId);
//        redisUtils.setex(Constants.REDIS_KEY_USER_CONTACT + userId,userContactList,Constants.REDIS_KEY_EXPIRES_ONE_MIN * 24);
        redisUtils.lpushAll(Constants.REDIS_KEY_USER_CONTACT + userId,userContactList,Constants.REDIS_KEY_TOKEN_EXPIRES);
    }

    public List<String> getMyContact(String userId){
//       return (List<String>) redisUtils.get(Constants.REDIS_KEY_USER_CONTACT + userId);
        return (List<String>)redisUtils.getQueueList(Constants.REDIS_KEY_USER_CONTACT + userId);
    }

    public void removeUserHeartBeat(String userId) {
        redisUtils.delete(Constants.REDIS_KEY_WS_USER_HEART_BEAT + userId);
    }

    public void cleanUserTokenByUserId(String userId) {
        String token = (String) redisUtils.get(Constants.REDIS_KEY_WS_TOKEN_USERID + userId);
        redisUtils.delete(Constants.REDIS_KEY_WS_TOKEN_USERID + userId);
        redisUtils.delete(Constants.REDIS_KEY_WS_TOKEN + token);
    }

    public void addUserContact(String userId,String contactId){
        List<String> myContact = getMyContact(userId);
        if (myContact.contains(contactId)){
            return;
        }
        redisUtils.lpush(Constants.REDIS_KEY_USER_CONTACT + userId,contactId,Constants.REDIS_KEY_TOKEN_EXPIRES);
    }
    public void delete1UserContact(String userId,String contactId){
        List<String> myContact = getMyContact(userId);
        myContact.remove(contactId);
        redisUtils.delete(Constants.REDIS_KEY_USER_CONTACT + userId);
        saveMyContact(userId,myContact);
    }

    public TokenUserInfoDto getTokenUserInfoByUserId(String userId){
        String token = (String)redisUtils.get(Constants.REDIS_KEY_WS_TOKEN + userId);
        TokenUserInfoDto tokenUserInfoDto = getTokenUserInfoDto(token);
        return tokenUserInfoDto;
    }

    public void removeUserContact(String userId, String contactId) {
        redisUtils.remove(userId,contactId);
    }
}
